﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ControlsLib;
using System.Linq.Expressions;
using GestionePolveri2.DAL;
using LinqKit;
using System.Data.Objects;
using GestionePolveriLib.Facades;
using FrameworkLib.Filters;
using GestionePolveriLib.BL.FilterBags;

namespace GestionePolveriLib.BL.Filters
{
    public class AmministrazioneFilterBag : FilterBase<Lotti>, IFilterBase
    {
        public string NumDDT { get; set; }
        public string Fornitore { get; set; }
        public string CodicePolvere { get; set; }
        public string CodiceLotto { get; set; }
        public LottoLoadingModes LoadingMode { get; set; }
        public string Famiglia { get; set; }
        public string NumFatt { get; set; }

        public AmministrazioneFilterBag()
        {
            InitializeFilter();
        }

        public void InitializeFilter()
        {
            NumDDT = null;
            Fornitore = null;
            CodicePolvere = null;
            CodiceLotto = null;
            LoadingMode = LottoLoadingModes.NotAssociated;
            Famiglia = null;
            NumFatt = null;
        }

        public override Expression<Func<Lotti, bool>> SetUpFilter()
        {
            var predicate = PredicateBuilder.True<Lotti>();

            if (this.UseDates)
            {
                // aggiungi al filtro il controllo sulla data...
                predicate = predicate.And(im => (EntityFunctions.TruncateTime(im.DataDdt) >= EntityFunctions.TruncateTime(this.PeriodFrom)) &&
                                                 EntityFunctions.TruncateTime(im.DataDdt) <= EntityFunctions.TruncateTime(this.PeriodTo));
            }

            switch (LoadingMode)
            {
                case LottoLoadingModes.NotAssociated:
                    predicate = predicate.And(im => ((im.NumFattura == null) || (im.NumFattura == string.Empty) || (im.DataFattura == null))); // || im.PrezzoUnitario==0));
                    break;
                case LottoLoadingModes.Associated:
                    predicate = predicate.And(im => ((im.NumFattura != null) && (im.NumFattura != string.Empty) && (im.DataFattura != null))); // && im.PrezzoUnitario!=0));
                    break;
                case LottoLoadingModes.All:
                    break;
                case LottoLoadingModes.Different:
                    predicate = predicate.And(im => (im.Giacenza_iniziale != im.QuantitaFatt));
                    break;
                default:
                    break;
            }

            if (!string.IsNullOrWhiteSpace(Famiglia))
            {
                //predicate = predicate.And(im => im.AnagPolveri.FamiglieColoriXPolveri.Famiglie.Contains(Famiglia));
                
                predicate = predicate.And(im => im.AnagPolveri.FamiglieColoriXPolveri.Famiglie == Famiglia);

                //predicate = predicate.And(im => im.FamiglieColoriXPolveri.Famiglie == Famiglia);
            }

            if (!string.IsNullOrWhiteSpace(CodicePolvere))
            {
                predicate = predicate.And(im => im.AnagPolveri.CodicePolvere == CodicePolvere);
            }

            if (!string.IsNullOrWhiteSpace(CodiceLotto))
            {
                predicate = predicate.And(im => im.CodLotto == CodiceLotto);
            }

            if (!string.IsNullOrWhiteSpace(Fornitore))
            {
                predicate = predicate.And(im => im.AnagPolveri.AnagFornitori.Descrizione == Fornitore);
            }

            if (!string.IsNullOrWhiteSpace(NumDDT))
            {
                predicate = predicate.And(im => im.NumDdt == NumDDT);
            }

            if (!string.IsNullOrWhiteSpace(NumFatt))
            {
                predicate = predicate.And(im => im.NumFattura == NumFatt);
            }

            return predicate;
        }

        public override string ToTraceString()
        {
            string retValue = base.ToTraceString();

            StringBuilder sb = new StringBuilder(base.ToTraceString());

            sb.Append(FilterBagHelper.GetCodicePolvereTraceString(this.CodiceLotto));
            sb.Append(FilterBagHelper.GetCodiceColoreTraceString(this.CodicePolvere));
            sb.Append(FilterBagHelper.GetFornitoreTraceString(this.Fornitore));
            sb.Append(FilterBagHelper.GetLoadingModeTraceString(this.LoadingMode));
            sb.Append(FilterBagHelper.GetNumDDTTraceString(this.NumDDT));


            return sb.ToString();
        }
    }
}
